/**
 * Copyright (c) [2025] [何屹林]
 *
 * 保留所有权利。
 *
 * 文件名称：LR1.h
 * 模块功能说明：
 * 该模块实现LR1相关分析，定义生成LR1内容的各种函数，并构建LR1状态表和转移表。
 *
 * 华南师范大学-计算机学院-网络工程-1班
 * 作者：何屹林-20222132023
 * 完成日期：2025年7月24日
 */
#ifndef LR1_H
#define LR1_H

#pragma once

#include <QString>
#include <QStringList>
#include <QVector>
#include <QSet>
#include <QHash>
#include <QDebug>
#include "utils.h"

// 单个状态
typedef struct State {
    QSet<Item> st;  //地图是有魔法的

    static State closure(State I,QHash<QString, QSet<QStringList>> grammars, QVector<QString> nonFinalizers, QHash<QString, QSet<QString>> first_set);//求闭包

    static State change(State I, QString X, QHash<QString, QSet<QStringList>> grammars, QVector<QString> nonFinalizers, QHash<QString, QSet<QString>> first_set);

    static bool haveSameCore(State i, State j);

    friend bool operator==(const State a, const State b) {
        return a.st == b.st;
    }

}state;

size_t qHash(const State& key);

class LR1           //构建lr1
{
public:
    LR1():size(0){};
    int size;
    QHash<State, int> state_hash;                   //存储state
    QHash<int, QHash<QString, int>> reduce_hash;    //归约动作
    QHash<int, QHash<QString, int>> change_hash;    //状态转移

    void buildLR1(State first_state, QHash<QString, QSet<QStringList>> grammars, QVector<QString> nonFinalizers,
                  QHash<QString, QSet<QString>> first_set, QHash<QString, QSet<QString>> follow_set,QVector<Gram> Grams);
};


#endif // LR1_H
